package com.lin.redis.entity;

import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

@Data
@ToString
@RedisHash(value = "people") // 必须要加上这个注解，不然加载不进去xxxxRepository
public class Person {
    @Id
    String id;

//    @Indexed // 为此字段建立索引，只有建立索引的属性，使用此属性查询时，才能生效
    String name;
    String gender;
    @Indexed
    Integer age;
    Integer sort;
    Address address;

    /**
     * 底层实列的创建原理。使用ObjectInstantiator instantiator创建。
     */
    public Person() {
    }

    /**
     * 如果一个类有两种有参数构造器，那么在运行时，创建对象实列的时候，就会出错。
     * 异常描述：Failed to instantiate com.lin.redis.entity.Person using constructor NO_CONSTRUCTOR with arguments
     * 出现原因：因为底层是采用原生反射的机制创建实列。而且是以某人的构造的方式创建。
     * 解决：要解决多总有参数构造器，就必须指定某个构造器使用@PersistenceConstructor（旧版），@PersistenceCreator（新版）
     */
    public Person(String name) {
        this.name = name;
    }

    @PersistenceConstructor
    public Person(String name, String gender, Address address) {
        this.name = name;
        this.gender = gender;
        this.address = address;
    }
}